package com.imooc.controller;


import com.imooc.dataobject.ProductInfo;
import com.imooc.utils.IdWorker;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.math.BigDecimal;

@RestController
@RequestMapping("/redis/cache")

// 作用域配置
@CacheConfig(cacheNames = "productId")
public class RedisCacheTestController {
    
    ProductInfo productInfo = ProductInfo.builder()
            .productName("华为手机8")
            .productPrice(new BigDecimal(2999))
            .productStock(10000).build();
    
    /**
     * 添加缓存到reids ，
     * 如果redis 存在，就直接查询redis ，会再次执行数据库查询
     *
     * http://127.0.0.1:8080/sell/redis/cache/findOne?id=1234
     * @param id
     * @return
     */
    @RequestMapping("/findOne")
    @Cacheable(value="product", key="'product_'+#id")
    public ProductInfo findOneProduct(@RequestParam(value="id",defaultValue="1",required=true) Integer id) {
    
//        IdWorker idWorker = new IdWorker();
//        productInfo.setProductId(idWorker.nextId()+"");
//        productInfo.setProductId(idWorker.nextId()+"");
//        productInfo.setProductName("华为手机9");
    
        if (id!=1){
            productInfo.setProductId("1234");
        }else {
            productInfo.setProductId(id+"");
        }
        System.out.println("product查询:"+productInfo);
        return productInfo;
    }
    
    
    /**
     *
     *  清除redis缓存
     *  有的时候我们可能并不希望缓存一个方法所有的返回结果。
     *  通过condition属性可以实现这一功能。condition属性默认为空，表示将缓存所有的调用情形。
     * 通过SpringEL表达式来指定的，当为true时表示进行缓存处理；
     * 当为false时表示不进行缓存处理，即每次调用该方法时该方法都会执行一次。
     *
     * http://127.0.0.1:8080/sell/redis/cache/updateProductNoAddCache?id=1234
     * @param id
     * @return
     */
    @RequestMapping("/updateProductNoAddCache")
//    @CacheEvict(value="product", key="'product_'+#id",condition="#id!=1")  // EL表达式为true才进行缓存，false不缓存返回结果
    @CacheEvict(value="product", key="'product_'+#id")
    public String updateProductNoAddCache(Integer id) {
        
        IdWorker idWorker = new IdWorker();
//        productInfo.setProductId(idWorker.nextId()+"");
    
        String pno = String.valueOf(idWorker.nextId());
        String substring = pno.substring(pno.length()-6, pno.length());
        
        productInfo.setProductName("华为手机" + substring);
        System.out.println("product更新数据库，清除redis缓存");
        
        return "product更新数据库,清除redis缓存:"
                + productInfo.getProductId()
                +":"+productInfo.getProductName()
                +":"+productInfo.getProductPrice()
                +":"+productInfo.getProductStock();
    }
    
    
    /**
     * 更新商品同时更新redis缓存
     *
     * http://127.0.0.1:8080/sell/redis/cache/updateProductAddCache?id=1234
     *
     * @param id
     * @return
     */
    @RequestMapping("/updateProductAddCache")
    @CachePut(value="product", key="'product_'+#id")
    public ProductInfo updateProductAddCache(Integer id) {
        
        IdWorker idWorker = new IdWorker();
//        productInfo.setProductId(idWorker.nextId()+"");
        
        String pno = String.valueOf(idWorker.nextId());
        String substring = pno.substring(pno.length()-6, pno.length());
        
        productInfo.setProductName("华为手机" + substring);
        System.out.println("product更新数据库，更新redis缓存");
        
        return productInfo;
    }
    
    
}
